package model;


public class Elemento {

	private double h;
	private double x1;
	private double x2;
	private Matriz local;
	private Vetor fLocal;
	private double alfa;
	private double beta;
	
	public Elemento(double inicio,double fim,double alfa,double beta) {
		x1=inicio;
		x2=fim;
		h=x2-x1;
		this.alfa=alfa;
		this.beta=beta;
		gerarMatrizLocal();
		gerarvetorFLocal();
	}

	public Vetor getFLocal() {
		return fLocal;
	}

	public void setFLocal(Vetor local) {
		fLocal = local;
	}

	public double getH() {
		return h;
	}

	public void setH(double h) {
		this.h = h;
	}

	public Matriz getMatrizLocal() {
		return local;
	}

	public void setLocal(Matriz local) {
		this.local = local;
	}

	public double getX1() {
		return x1;
	}

	public void setX1(double x1) {
		this.x1 = x1;
	}

	public double getX2() {
		return x2;
	}

	public void setX2(double x2) {
		this.x2 = x2;
	}
	
	private void gerarMatrizLocal(){
		local=new Matriz(2);
		
		//calculo de k11 e k22;
		double temp=0;
		double temp1=0;
		temp+=2*alfa/h;
		temp*=PhiKsi.derivada(1, Constantes.pontoGauss1);
		temp*=PhiKsi.derivada(1, Constantes.pontoGauss1);
		temp1+=beta*h/2;
		temp1*=PhiKsi.imagem(1, Constantes.pontoGauss1);
		temp1*=PhiKsi.imagem(1, Constantes.pontoGauss1);
		temp+=temp1;
		temp1=0;
		temp1+=2*alfa/h;
		temp1*=PhiKsi.derivada(1, Constantes.pontoGauss2);
		temp1*=PhiKsi.derivada(1, Constantes.pontoGauss2);
		temp+=temp1;
		temp1=0;
		temp1+=beta*h/2;
		temp1*=PhiKsi.imagem(1, Constantes.pontoGauss2);
		temp1*=PhiKsi.imagem(1, Constantes.pontoGauss2);
		temp+=temp1;
		
		local.setValor(0, 0, temp);
		
		temp=0;
		temp1=0;
		temp+=2*alfa/h;
		temp*=PhiKsi.derivada(2, Constantes.pontoGauss1);
		temp*=PhiKsi.derivada(2, Constantes.pontoGauss1);
		temp1+=beta*h/2;
		temp1*=PhiKsi.imagem(2, Constantes.pontoGauss1);
		temp1*=PhiKsi.imagem(2, Constantes.pontoGauss1);
		temp+=temp1;
		temp1=0;
		temp1+=2*alfa/h;
		temp1*=PhiKsi.derivada(2, Constantes.pontoGauss2);
		temp1*=PhiKsi.derivada(2, Constantes.pontoGauss2);
		temp+=temp1;
		temp1=0;
		temp1+=beta*h/2;
		temp1*=PhiKsi.imagem(2, Constantes.pontoGauss2);
		temp1*=PhiKsi.imagem(2, Constantes.pontoGauss2);
		temp+=temp1;
		local.setValor(1,1,temp);
		
		//calculo de k12 e k21;
		temp=0;
		temp1=0;
		temp+=2*alfa/h;
		temp*=PhiKsi.derivada(1, Constantes.pontoGauss1);
		temp*=PhiKsi.derivada(2, Constantes.pontoGauss1);
		temp1+=beta*h/2;
		temp1*=PhiKsi.imagem(1, Constantes.pontoGauss1);
		temp1*=PhiKsi.imagem(2, Constantes.pontoGauss1);
		temp+=temp1;
		temp1=0;
		temp1+=2*alfa/h;
		temp1*=PhiKsi.derivada(1, Constantes.pontoGauss2);
		temp1*=PhiKsi.derivada(2, Constantes.pontoGauss2);
		temp+=temp1;
		temp1=0;
		temp1+=beta*h/2;
		temp1*=PhiKsi.imagem(1, Constantes.pontoGauss2);
		temp1*=PhiKsi.imagem(2, Constantes.pontoGauss2);
		temp+=temp1;
		
		local.setValor(0, 1, temp);
		local.setValor(1,0, local.getValor(0,1));
	}

	private void gerarvetorFLocal(){
		
		this.fLocal=new Vetor(2);
	
		double temp;
		temp=FKsi.imagem(Constantes.pontoGauss1, this);
		temp*=PhiKsi.imagem(1, Constantes.pontoGauss1);
		temp*=(h/2);
		double temp1;
		temp1=FKsi.imagem(Constantes.pontoGauss2, this);
		temp1*=PhiKsi.imagem(1, Constantes.pontoGauss2);
		temp1*=(h/2);
		
		this.fLocal.setValor(0, temp+temp1);
		
		temp=FKsi.imagem(Constantes.pontoGauss1, this);
		temp*=PhiKsi.imagem(2, Constantes.pontoGauss1);
		temp*=(h/2);
		temp1=FKsi.imagem(Constantes.pontoGauss2, this);
		temp1*=PhiKsi.imagem(2, Constantes.pontoGauss2);
		temp1*=(h/2);
		
		this.fLocal.setValor(1, temp+temp1);
	}
	
}
